#ifndef PAGERENDERCONTEXT_H
#define PAGERENDERCONTEXT_H

#include <QSize>
#include <QString>
#include "pagenumberformatter.h"

// 前向声明
class PageView;
class ProcessingSettings;

/**
 * @brief Martin Fowler重构：页面渲染上下文值对象
 *
 * 解决代码异味：
 * - Shotgun Surgery: 统一渲染参数传递
 * - Data Class Proliferation: 单一数据源
 * - Feature Envy: 封装渲染所需的全部上下文
 *
 * 设计原则：
 * - Value Object: 不可变，线程安全
 * - Single Source of Truth: 统一的页面计数来源
 * - Tell Don't Ask: 封装行为而非暴露数据
 */
class PageRenderContext
{
public:
    // 默认构造函数：用于临时变量
    PageRenderContext()
        : m_currentPage(0)
        , m_totalPages(1)
        , m_viewportSize(QSize(800, 600))
        , m_globalPage(1)
    {
    }

    // 构造函数：强制完整上下文
    PageRenderContext(int currentPage, int totalPages, const QSize& viewportSize)
        : m_currentPage(currentPage)
        , m_totalPages(totalPages)
        , m_viewportSize(viewportSize)
        , m_globalPage(currentPage + 1)
    {
    }

    // 扩展构造函数：包含全局页码信息
    PageRenderContext(int currentPage, int totalPages, const QSize& viewportSize, int globalPage)
        : m_currentPage(currentPage)
        , m_totalPages(totalPages)
        , m_viewportSize(viewportSize)
        , m_globalPage(globalPage)
    {
    }

    // 拷贝赋值操作符
    PageRenderContext& operator=(const PageRenderContext& other) {
        if (this != &other) {
            const_cast<int&>(m_currentPage) = other.m_currentPage;
            const_cast<int&>(m_totalPages) = other.m_totalPages;
            const_cast<QSize&>(m_viewportSize) = other.m_viewportSize;
            const_cast<int&>(m_globalPage) = other.m_globalPage;
        }
        return *this;
    }

    // 访问器：Tell Don't Ask原则
    int getCurrentPage() const { return m_currentPage; }
    int getTotalPages() const { return m_totalPages; }
    QSize getViewportSize() const { return m_viewportSize; }
    int getGlobalPage() const { return m_globalPage; }

    // Martin Fowler重构：集成PageNumberFormatter的上下文
    PageNumberFormatter::FormatContext getFormatterContext(const QString& format = "{page}") const {
        return PageNumberFormatter::FormatContext(m_globalPage, m_totalPages, format);
    }

    // 页码格式化便捷方法
    QString formatPageNumber(const QString& format = "{page}") const {
        return PageNumberFormatter::format(getFormatterContext(format));
    }

    // 导航方法：封装页面逻辑
    PageRenderContext nextPage() const {
        return PageRenderContext(m_currentPage + 1, m_totalPages, m_viewportSize, m_globalPage + 1);
    }

    PageRenderContext previousPage() const {
        return PageRenderContext(m_currentPage - 1, m_totalPages, m_viewportSize, m_globalPage - 1);
    }

    // 验证方法：业务规则封装
    bool hasNextPage() const { return m_currentPage < m_totalPages - 1; }
    bool hasPreviousPage() const { return m_currentPage > 0; }
    bool isValidPage() const { return m_currentPage >= 0 && m_currentPage < m_totalPages; }

    // 页码转换：1基索引 ↔ 0基索引
    int getDisplayPageNumber() const { return m_currentPage + 1; }  // 1基索引用于显示
    int getArrayIndex() const { return m_currentPage; }             // 0基索引用于数组

    // Factory Method: 从PageView创建（避免构造函数污染）
    static PageRenderContext fromPageView(int currentPageIndex, int totalPagesCount, const QSize& viewport);

    // Martin Fowler重构：Single Source of Truth Factory Method
    // 确保totalPages来源统一（处理后的显示页数）
    static PageRenderContext fromUnifiedSource(const class PageView* pageView, const QSize& viewport);

    // Martin Fowler重构：从ProcessingSettings创建完整上下文
    static PageRenderContext fromProcessingSettings(const PageView* pageView,
                                                   const ProcessingSettings* settings,
                                                   const QSize& viewport);

private:
    const int m_currentPage;      // 0基索引
    const int m_totalPages;       // 总页数
    const QSize m_viewportSize;   // 视口尺寸
    const int m_globalPage;       // 全局页码（跨文件连续页码，1基索引）
};

// 内联实现简单工厂方法
inline PageRenderContext PageRenderContext::fromPageView(int currentPageIndex, int totalPagesCount, const QSize& viewport)
{
    return PageRenderContext(currentPageIndex, totalPagesCount, viewport, currentPageIndex + 1);
}

#endif // PAGERENDERCONTEXT_H